#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "hi_adc.h"
#include "hi_uart.h"
#include "hi_io.h"
#include "hi_gpio.h"
#include "iot_gpio.h"
#include "iot_errno.h"
#include "net_demo.h"
#include "net_common.h"

#include "hi_pwm.h" //蜂鸣器的头文件
#include "iot_pwm.h"
#include "GasDetection.h"

#define IOT_UART_IDX_1 (1) // uart索引1，通过这个1的索引找东西
#define STACK_SIZE 1024
#define DELAY_US (500000) // 0.5秒的延迟，以便观察LED状态
#define PWM_DUTY_99 99    // 占空比
#define PWM_DUTY_50 50    // 占空比
#define PWM_DUTY_20 20    // 占空比
#define PWM_DUTY_10 10    // 占空比
#define PWM_DUTY_5 5      // 占空比
#define PWM_DUTY_10 10    // 占空比
#define PWM_FREQ_4k (4000)
#define IOT_GPIO_BEEP 9
#define LED_TASK_GPIO_R 10
#define LED_TASK_GPIO_G 5
#define LED_TASK_GPIO_Y 12
#define BEEP_PWM 0   // GPIO9
#define RED_PWM 1    // GPIO10
#define GREEN_PWM 2  // GPIO11
#define YELLOW_PWM 3 // GPIO12

int warning_threshold = 600; // 报警阈值
int danger_threshold = 1000; // 危险阈值
hi_float voltage;
hi_float gas_concentration;
hi_u32 ret;
hi_u16 value;
hi_u32 val;
hi_float vol;
// 不断从ADC读取电压值，计算对应的气体浓度，并通过串口打印这些值，直到程序被停止。

// static float ADCTask(void)
// {
//         // 通过使用hi_adc_read函数来读取ADC_CHANNEL_5的数值
//         ret = hi_adc_read(HI_ADC_CHANNEL_2, &value, HI_ADC_EQU_MODEL_8, HI_ADC_CUR_BAIS_DEFAULT, 0xFF);
//         // 打印AD值
//         printf(" AD值: %u\n", (unsigned int)value);
//         if (ret != HI_ERR_SUCCESS)
//         {
//             printf(" ADC Read Fail\n");
//             return -1;
//         }
//         usleep(DELAY_US);
//         return (unsigned int)value; // 返回ADC值
// }

static float ADCTask(void)
{
    ret = hi_adc_read(HI_ADC_CHANNEL_5, &value, HI_ADC_EQU_MODEL_8, HI_ADC_CUR_BAIS_DEFAULT, 0xFF);
    // 打印AD值
    if (ret != HI_ERR_SUCCESS)
    {
        printf("ADC Read Fail\n");
        return -1;
    }
    return (unsigned int)value;
}

// 一直检测和执行报警状态
int GasDetection_Task(int sockfd)
{
    printf("GasDetection Start!\n");
    int val = ADCTask();
    char buffer[100];
    sprintf(buffer, "%d", val); // 将整数值转换为字符串

    // 获取ADC值
    send(sockfd, buffer, sizeof(buffer), 0);
    printf("%s\n", buffer);
    printf("------------------\n");
}

void AutoGasDetection_Task(void)
{
    printf("AutoGasDetection Start!\n");
    while (1) // 一直检测
    {
        val = ADCTask();
        // 获取ADC值
        if (val >= warning_threshold && val <= danger_threshold) // 与阈值进行判断
        {
            printf("warning\n");
            IoTPwmStop(GREEN_PWM); // 绿灯不亮
            IoTPwmStart(BEEP_PWM, PWM_DUTY_5, PWM_FREQ_4k);
            IoTPwmStart(YELLOW_PWM, PWM_DUTY_99, PWM_FREQ_4k);
            usleep(DELAY_US);     // 0.5秒延时
            IoTPwmStop(BEEP_PWM); // 蜂鸣器间断叫
        }
        else if (val >= danger_threshold) // 危险阈值
        {
            printf("danger\n");
            IoTPwmStop(GREEN_PWM); // 绿灯不亮
            IoTPwmStop(YELLOW_PWM);
            IoTPwmStart(BEEP_PWM, PWM_DUTY_10, PWM_FREQ_4k);
            IoTPwmStart(RED_PWM, PWM_DUTY_99, PWM_FREQ_4k);
            usleep(DELAY_US);     // 0.5秒延时
            IoTPwmStop(BEEP_PWM); // 蜂鸣器间断叫
        }
        else // 低于阈值
        {
            // 低于阈值处于关闭状态
            IoTPwmStop(RED_PWM);
            IoTPwmStop(BEEP_PWM);
            IoTPwmStop(YELLOW_PWM);
            IoTPwmStart(GREEN_PWM, PWM_DUTY_99, PWM_FREQ_4k);
            usleep(DELAY_US);
        }
    }
}

// 创建线程用于执行GasDetection_Entry函数，同时在创建失败时输出错误信息
static void GasDetection_Entry(void)
{
    osThreadAttr_t attr = {0};

    hi_gpio_init();
    IoTGpioInit(LED_TASK_GPIO_G);
    IoTPwmInit(BEEP_PWM);
    IoTPwmInit(RED_PWM);
    IoTPwmInit(GREEN_PWM);
    IoTPwmInit(YELLOW_PWM);
    hi_io_set_func(LED_TASK_GPIO_R, HI_IO_FUNC_GPIO_10_PWM1_OUT);
    hi_io_set_func(LED_TASK_GPIO_G, HI_IO_FUNC_GPIO_5_PWM2_OUT);
    hi_io_set_func(LED_TASK_GPIO_Y, HI_IO_FUNC_GPIO_12_PWM3_OUT);
    hi_io_set_func(IOT_GPIO_BEEP, HI_IO_FUNC_GPIO_9_PWM0_OUT);
    hi_io_set_func(HI_GPIO_IDX_11, HI_IO_FUNC_GPIO_11_GPIO);
    IoTGpioSetDir(IOT_GPIO_BEEP, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(LED_TASK_GPIO_R, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(LED_TASK_GPIO_G, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(LED_TASK_GPIO_Y, IOT_GPIO_DIR_OUT);
    hi_gpio_set_dir(HI_GPIO_IDX_11, IOT_GPIO_DIR_IN);

    attr.name = "GasDetection_Task";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = STACK_SIZE;
    attr.priority = osPriorityNormal1;
    if (osThreadNew((osThreadFunc_t)AutoGasDetection_Task, NULL, &attr) == NULL)
    {
        printf("[UartDemo] Failed to create Detection_Task!\n");
    }
}

SYS_RUN(GasDetection_Entry);

// else
// {
//     // 获取电压值
//     voltage = (float)hi_adc_convert_to_voltage(value);
//     if (voltage > 0)
//     {
//         // 打印电压值
//         printf(" voltage = %.2fV\r\n", voltage);
//         // 计算气体浓度
//         gas_concentration = 5 / voltage - 1;
//         // 通过串口打印气体浓度值
//         printf(" Gas concentration: %.2fPPM\r\n", gas_concentration);
//     }
// }
// printf("%d", value);